package top.yxqz.spring.porxy;

import com.sun.deploy.net.proxy.ProxyHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @author: 余小小
 * @date: 2023/4/11
 * @description：动态代理
 */
@Component
public class ProxyFactory {
    private Object target;

    public Object getTarget() {
        return target;
    }

    public void setTarget(Object target) {
        this.target = target;
    }

    public Object getProxy() {

        /**
         *ClassLoader loader：类加载器，指定加载动态生成的代理类的类加载器
         *Class<?>[] interfaces：获取目标对象实现的所有接口的所有Class对象数组
         *InvocationHandler：执行处理，设置代理类中的抽象方法如何重写
         */
        ClassLoader classLoader = this.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();

        InvocationHandler invocationHandler = new InvocationHandler() {
            /**
             *
             * @param proxy 代理对象
             * @param method 要执行的方法
             * @param args 要执行的方法的参数列表
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("开始执行，方法名字："+method.getName()+"\t参数："+ Arrays.toString(args));
                Object invoke = method.invoke(target, args);
                return invoke;
            }
        };
        return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
    }
}
